package servicos;

import java.sql.ResultSet;
import java.util.ArrayList;

import javax.swing.JOptionPane;

import entidades.Cargo;
import entidades.Funcionario;
import entidades.ItensVenda;
import entidades.Produto;
import entidades.Venda;
import DALC.ConexaoSQL;

public class Servicos {
	public static final String ADICIONAR = "adicionar";
	public static final String SUBTRAIR = "subtrair";
	private Venda venda;
	private Funcionario funcLogado = new Funcionario();

	public Funcionario getFuncLogado() {
		return funcLogado;
	}

	public void logarFuncionario(String cpf, String senha) throws Exception {
		String sql = "Select Funcionario.cpf, funcionario.nome,funcionario.salario, cargo.codCargo, cargo.descricao "
				+ "from Funcionario inner join cargo "
				+ "on funcionario.cargo = cargo.codCargo "
				+ "where funcionario.cpf like '"
				+ cpf
				+ "' and funcionario.senha like '" + senha + "'";
		ConexaoSQL con = new ConexaoSQL();
		ResultSet rs = con.execute(sql, ConexaoSQL._QUERY);
		
		if (rs.next()) {
			Cargo cargo = new Cargo();

			funcLogado.setCpf(rs.getString(1));

			funcLogado.setNome(rs.getString(2));
			funcLogado.setSalario(Float.parseFloat(rs.getString(3)));
			cargo.setCodigo(Integer.parseInt(rs.getString(4)));
			cargo.setDescricacao(rs.getString(5));
			funcLogado.setCargo(cargo);

		} else {
			funcLogado = null;
		}
		con.closeConexao();
	}

	public void addVenda(Venda venda) {
		this.venda = venda;
	}

	public Venda getVenda() {
		return venda;
	}

	public void inserirFuncionario(Funcionario funcionario) throws Exception {
		String sql = "INSERT into funcionario(cpf,nome,salario,cargo,senha) values('"
				+ funcionario.getCpf()
				+ "','"
				+ funcionario.getNome()
				+ "',"
				+ funcionario.getSalario()
				+ ","
				+ funcionario.getCargo().getCodigo()
				+ ",'"
				+ funcionario.getSenha() + "')";

		ConexaoSQL con = new ConexaoSQL();

		con.execute(sql, ConexaoSQL._EXECUTE);
		con.closeConexao();

	}


	public ResultSet selecionarProduto(int codigo) throws Exception {

		String sql = "SELECT * from produtos where codigo = " + codigo;
		ConexaoSQL con = new ConexaoSQL();
		ResultSet rs = con.execute(sql, ConexaoSQL._QUERY);
		
		
		con.closeConexao();
		return rs;
	}

	public Produto[] selecionarProdutos() throws Exception{
		Produto[] produto;
		String sql = "SELECT * FROM produtos";
		ConexaoSQL con = new ConexaoSQL();
		ResultSet rs = con.execute(sql, ConexaoSQL._QUERY);
		int cont = 0;
		while(rs.next()){
			cont++;
		}
		rs.beforeFirst();
		produto = new Produto[cont];
		cont = 0;
		while(rs.next()){
			produto[cont] = new Produto();
			produto[cont].setCodigo(rs.getInt("codigo"));
			produto[cont].setDescricao(rs.getString("descricao"));
			produto[cont].setPreco(rs.getFloat("preco"));
			produto[cont].setQtdEstoque(rs.getInt("qtdEstoque"));
			cont++;
		}
		con.closeConexao();
		return produto;
	}
	
	public Produto getProdutoBanco(int codigo) throws Exception {
		ResultSet rs = this.selecionarProduto(codigo);
		rs.next();
		Produto produto = new Produto();
		produto.setCodigo(Integer.parseInt(rs.getString("codigo")));
		produto.setDescricao(rs.getString("descricao"));
		produto.setPreco(Float.parseFloat(rs.getString("preco")));
		produto.setQtdEstoque(Integer.parseInt(rs.getString("qtdEstoque")));
		
		
		return produto;
	}

	public ResultSet selecionarFuncionarios() throws Exception {

		ConexaoSQL con = new ConexaoSQL();
		String sql = "SELECT funcionario.cpf, funcionario.nome,cargo.codCargo, cargo.descricao, funcionario.salario from "
				+ "funcionario inner join cargo "
				+ "on funcionario.cargo = cargo.codCargo";

		ResultSet rs = con.execute(sql, ConexaoSQL._QUERY);

		return rs;
	}

	public boolean inserirProduto(Produto produto) throws Exception {
		boolean retorno = false;

		String sql = "INSERT into produtos(codigo, descricao, qtdEstoque,preco) values("
				+ produto.getCodigo()
				+ ",'"
				+ produto.getDescricao()
				+ "',"
				+ produto.getQtdEstoque() + "," + produto.getPreco() + ")";
		ConexaoSQL con = new ConexaoSQL();
		con.execute(sql, ConexaoSQL._EXECUTE);
		retorno = true;
		
		con.closeConexao();
		return retorno;
	}

	
	
	
	public void deletarProduto(Produto produto) throws Exception{
		String sql = "DELETE FROM produtos where codigo =" + produto.getCodigo();
		ConexaoSQL con = new ConexaoSQL();
		con.execute(sql, ConexaoSQL._EXECUTE);
		
		con.closeConexao();
		
	}
	
	
	public void deletarFuncionario(Funcionario funcionario) throws Exception {
		String sql = "DELETE from funcionario where cpf like '"
				+ funcionario.getCpf() + "'";
		ConexaoSQL con = new ConexaoSQL();

		con.execute(sql, ConexaoSQL._EXECUTE);
		con.closeConexao();

	}

	public void atualizarFuncionario(Funcionario funcionario) throws Exception {
		String sql = "UPDATE funcionario set nome = '" + funcionario.getNome()
				+ "', cargo=" + funcionario.getCargo().getCodigo()
				+ ", salario= " + funcionario.getSalario()
				+ " where cpf like '" + funcionario.getCpf() + "'";
		ConexaoSQL con = new ConexaoSQL();
		con.execute(sql, ConexaoSQL._EXECUTE);
		con.closeConexao();

	}

	public ResultSet selecionarFuncionario(String cpf) throws Exception {
		String sql = "SELECT funcionario.cpf, funcionario.nome, cargo.codCargo, cargo.descricao, funcionario.salario from "
				+ "funcionario inner join cargo "
				+ "on funcionario.cargo = cargo.codCargo "
				+ "where cpf like '"
				+ cpf + "'";
		ConexaoSQL con = new ConexaoSQL();
		ResultSet rs = con.execute(sql, ConexaoSQL._QUERY);
		con.closeConexao();
		
		return rs;
	}

	public void AtualizaFuncionarioESenha(Funcionario funcionario)
			throws Exception {
		String sql = "UPDATE funcionario set nome = '" + funcionario.getNome()
				+ "', cargo=" + funcionario.getCargo().getCodigo()
				+ ", salario= " + funcionario.getSalario() + ", senha = '"
				+ funcionario.getSenha() + "'" + " where cpf like '"
				+ funcionario.getCpf() + "'";
		ConexaoSQL con = new ConexaoSQL();
		con.execute(sql, ConexaoSQL._EXECUTE);
		con.closeConexao();
	}

	public Funcionario getFuncionarioBanco(String cpf) throws Exception {
		ResultSet rs = this.selecionarFuncionario(cpf);
		Cargo cargo = new Cargo();
		rs.next();
		Funcionario func = new Funcionario();
		func.setCpf(rs.getString("cpf"));
		func.setNome(rs.getString("nome"));
		func.setCargo(new Cargo(rs.getInt("cargo.codCargo"), rs
				.getString("cargo.descricao")));
		func.setSalario(Float.parseFloat((rs.getString("salario"))));
		
		return func;
	}

	public ResultSet selecionarCargos(String sql) throws Exception {
		ConexaoSQL con = new ConexaoSQL();
		ResultSet rs = con.execute(sql, ConexaoSQL._QUERY);
		con.closeConexao();
		return rs;
	}

	public boolean isGerente(String usuario, String senha) {
		boolean retorno = false;
		String sql = "SELECT count(*) from funcionario "
				+ "where cpf like '" + usuario + "' and senha like '" + senha
				+ "' and cargo = 1";
		ConexaoSQL con = new ConexaoSQL();

		try {
			ResultSet rs = con.execute(sql, ConexaoSQL._QUERY);
			rs.next();
			if (rs.getInt(1) > 0) {
				retorno = true;
			}
		} catch (Exception e) {
			JOptionPane.showMessageDialog(null,"Usuario nao autenticado", "Login de Gerencia", JOptionPane.ERROR_MESSAGE);
		}
		con.closeConexao();
		return retorno;
	}

	public String[] getCargos() throws Exception {
		String sql = "select descricao from cargo";
		ResultSet rs = this.selecionarCargos(sql);
		int cont = 0;
		while (rs.next()) {
			cont++;
		}
		rs.beforeFirst();
		String[] resultado = new String[cont];
		cont = 0;
		while (rs.next()) {
			resultado[cont] = rs.getString("descricao");
			cont++;
		}
		
		return resultado;

	}
	
	
	public void inserirVenda(int cancelado) throws Exception{
		String sql = "insert into venda(codFunc, dataVenda, totalVenda, cpfConsumidor, cancelado) values("+ funcLogado.getCpf()+", now(),"+ venda.getTotalVenda()+",'"+ venda.getCpfConsumidor() +"',"+cancelado+")";
		ConexaoSQL con = new ConexaoSQL();
		con.execute(sql, ConexaoSQL._EXECUTE);
		ResultSet rs = con.execute("select * from venda",ConexaoSQL._QUERY);
		rs.last();
		venda.setNumVenda(rs.getInt("numVenda"));
		for (ItensVenda i: venda.getItensVenda()){
			sql = "Insert into itensVenda(numVenda,totalItem,qtd,codProduto) values("+venda.getNumVenda()+","+ i.getTotalItem() + ","+i.getQtd() + "," + i.getProduto().getCodigo()+")";
			con.execute(sql, ConexaoSQL._EXECUTE);
		}
		con.closeConexao();
	}
	
	
	public boolean atualizaQtd(int qtd, int produto, String tipo){
		boolean retorno = false;
		String sql = null;
		if(tipo.equals("adicionar")){
			sql = "UPDATE produtos set qtdEstoque = qtdEstoque +"+ qtd +" where codigo = "+ produto;
		}
		else {
			sql = "UPDATE produtos set qtdEstoque = qtdEstoque -"+ qtd +" where codigo = "+ produto;
		}
		
		ConexaoSQL con = new ConexaoSQL();
		try {
			con.execute(sql, ConexaoSQL._EXECUTE);
			ResultSet rs = con.execute("select qtd from produtos where codigo = "+ produto, ConexaoSQL._QUERY);
			rs.next();
			if(rs.getInt("qtd")>0){
				retorno = true;
			}
			
		} catch (Exception e) {
			
		}
		con.closeConexao();
		return retorno;
		
	}


}
